﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BLLMagiPack.Managers;
using ModeloMagiPack.Entidades;

namespace MaGiPack
{
    public partial class FrmClientes : Form
    {
        private FrmVendedor _frmVendedor;
        Acciones _accionActual;
        private Cliente _miCliente;
        ControlesDomicilio _controlesDomicilio;

        public FrmClientes()
        {
            InitializeComponent();
            _controlesDomicilio = new ControlesDomicilio(cboProvincia, cboLocalidad);

            _accionActual = Acciones.alta;
            SeleccionarAccion();
            txtCuit.KeyPress += Utilidades.TextboxSoloNumeros_KeyPress;
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Utilidades.Application_ThreadException);
        }

        public Cliente ClienteSeleccionado
        {
            get
            {
                Cliente seleccionado = null;

                if (dgvPersonas.SelectedRows.Count > 0)
                {
                    seleccionado = new Cliente();
                    seleccionado.IdCliente = (int)dgvPersonas.SelectedRows[0].Cells["IdCliente"].Value;

                    BLLCliente bllCliente = new BLLCliente();
                    seleccionado = bllCliente.TraerCliente(seleccionado.IdCliente);
                }

                return seleccionado;
            }
        }        


        private void CargarDatosSeleccionados()
        {
            BLLLocalidad bllLocalidad = new BLLLocalidad();
            BLLVendedor bllVendedor = new BLLVendedor();
            DataGridViewRow filaSeleccionada;

            if (dgvPersonas.SelectedRows.Count > 0 && _accionActual != Acciones.alta)
            {
                filaSeleccionada = dgvPersonas.SelectedRows[0];

                _miCliente = ClienteSeleccionado;

                txtCuit.Text = _miCliente.Cuit;
                txtDomicilio.Text = _miCliente.Direccion;
                txtNombre.Text = _miCliente.Nombre;
                txtObservaciones.Text = _miCliente.Observaciones;
                txtResponsable.Text = _miCliente.Responsable;
                txtTelefono.Text = _miCliente.Telefono;

                Localidad l = bllLocalidad.TraerLocalidad(_miCliente.IdLocalidad);
                cboProvincia.SelectedIndex = l.Provincia;
                cboLocalidad.Text = l.Nombre;

                Vendedor v = bllVendedor.TraerVendedor(_miCliente.IdVendedor);
                cboVendedor.Text = v.Nombre;
            }
        }

        private void CargarGrilla()
        {
            BLLCliente bllCliente = new BLLCliente();
            BLLLocalidad bllLocalidad = new BLLLocalidad();
            BLLVendedor bllVendedor = new BLLVendedor();
            
            dgvPersonas.DataSource = (from c in bllCliente.TraerClientes(txtBuscar.Text)
                                         select new
                                         {
                                             IdCliente = c.IdCliente,
                                             Nombre = c.Nombre,
                                             Responsable = c.Responsable,
                                             Direccion = c.Direccion,
                                             Localidad = bllLocalidad.TraerLocalidad(c.IdLocalidad).Nombre,
                                             IdLocalidad = c.IdLocalidad,
                                             Telefono = c.Telefono,
                                             Vendedor = bllVendedor.TraerVendedor(c.IdVendedor).Nombre,
                                             IdVendedor = c.IdVendedor,
                                             Cuit = c.Cuit,
                                             Observaciones = c.Observaciones
                                         }).ToList();
        }

        private void CargarVendedores() 
        {
            BLLVendedor bllVendedor = new BLLVendedor();
            List<Vendedor> sellers = bllVendedor.TraerVendedores();

            cboVendedor.Items.Clear();
            cboVendedor.Items.Add("-- Seleccione Vendedor --");
            sellers.ForEach(v => cboVendedor.Items.Add(v));

            cboVendedor.SelectedIndex = 0;
        }
        
        private void SeleccionarAccion()
        {
            if (_accionActual.CompareTo(Acciones.alta) == 0)
            {
                this.Text = "Nuevo Cliente";
                //btnGuardar.Text = "Guardar nuevo";
                btnAgregar.Enabled = false;
                btnEditar.Enabled = true;
                btnRemover.Enabled = true;

                txtNombre.Enabled = true;
                txtResponsable.Enabled = true;
                cboProvincia.Enabled = true;
                cboLocalidad.Enabled = true;
                txtTelefono.Enabled = true;
                cboVendedor.Enabled = true;
                txtCuit.Enabled = true;
                txtObservaciones.Enabled = true;
                txtDomicilio.Enabled = true;
                _miCliente = new Cliente();
            }
            else
            {
                this.Text = "Modificar Cliente";
                //btnGuardar.Text = "Guardar cambios";
                btnEditar.Enabled = false;
                btnRemover.Enabled = true;
                btnAgregar.Enabled = true;

                txtNombre.Enabled = true;
                txtResponsable.Enabled = true;
                cboProvincia.Enabled = true;
                cboLocalidad.Enabled = true;
                txtTelefono.Enabled = true;
                cboVendedor.Enabled = true;
                txtCuit.Enabled = true;
                txtObservaciones.Enabled = true;
                txtDomicilio.Enabled = true;
            }
        }

        private bool ValidarDatos()
        {
            bool estaOK = true;
            Utilidades.LimpiarErrores(this, errorClientes);
            estaOK = Utilidades.ValidarDatos(this, errorClientes);
           
            return estaOK;
        }


        private void btnAgregar_Click(object sender, EventArgs e)
        {
            _accionActual = Acciones.alta;
            SeleccionarAccion();

            Utilidades.LimpiarControles(pnlDatos);
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            CargarGrilla();
        }
        
        private void btnDetalleVendedor_Click(object sender, EventArgs e)
        {
            _frmVendedor = new FrmVendedor();
            _frmVendedor.ShowDialog();
            CargarVendedores();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            _accionActual = Acciones.modificacion;
            CargarDatosSeleccionados();
            SeleccionarAccion();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarDatos())
                {
                    Cliente cliente;

                    if (_accionActual == Acciones.alta)
                        cliente = new Cliente();
                    else
                        cliente = ClienteSeleccionado;

                    cliente.Nombre = txtNombre.Text;
                    cliente.Responsable = txtResponsable.Text;
                    cliente.IdLocalidad = _controlesDomicilio.IdLocalidadSeleccionada;
                    cliente.Telefono = txtTelefono.Text;
                    cliente.IdVendedor = ((Vendedor)cboVendedor.SelectedItem).IdVendedor;
                    cliente.Cuit = txtCuit.Text;
                    cliente.Direccion = txtDomicilio.Text;
                    cliente.Observaciones = txtObservaciones.Text;

                    BLLCliente bllCliente = new BLLCliente();

                    switch (_accionActual)
                    {
                        case Acciones.alta:
                            bllCliente.CrearCliente(cliente);
                            Utilidades.LimpiarControles(pnlDatos);
                            break;
                        case Acciones.modificacion:
                            bllCliente.ModificarCliente(cliente);
                            break;
                        default:
                            break;
                    }

                    MessageBox.Show("¡Su operación se completó con éxito!", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    CargarGrilla();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnLocalidad_Click(object sender, EventArgs e)
        {
            FrmLocalidad frmLocalidad = new FrmLocalidad();
            frmLocalidad.ShowDialog();
            _controlesDomicilio.CargarLocalidades();
        }
        
        private void btnRemover_Click(object sender, EventArgs e)
        {
            Cliente cliente = ClienteSeleccionado;

            if (MessageBox.Show(string.Format("¿Eliminar cliente {0}?", cliente.Nombre), "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                BLLCliente bllCliente = new BLLCliente();

                try
                {
                    bllCliente.EliminarCliente(cliente);
                }
                catch (BLLMagiPackException ex)
                {
                    MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                
                CargarGrilla();
            }
        }

        private void dgvPersonas_SelectionChanged(object sender, EventArgs e)
        {
            CargarDatosSeleccionados();
            btnRemover.Enabled = btnEditar.Enabled = dgvPersonas.SelectedRows.Count > 0;
        }

        private void FrmClientes_Load(object sender, EventArgs e)
        {
            CargarVendedores();
            CargarGrilla();
        }
    }
}
